strtok, strtok_r(3)


synopsis

       #include <string.h>

       char *strtok(char *restrict str, const char *restrict delim);
       char *strtok_r(char *restrict str, const char *restrict delim,
                      char **restrict saveptr);

strtok_r์€ thread-safeํ•œ ๋ฒ„์ „์˜ strtok์ด๋‹ค. ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  saveptr์ด๋ผ๋Š” ์™ธ๋ถ€๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ.

example

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(int argc, char *argv[])
{
   char *str1, *str2, *token, *subtoken;
   char *saveptr1, *saveptr2;
   int j;

   if (argc != 4) {
	   fprintf(stderr, "Usage: %s string delim subdelim\n",
			   argv[0]);
	   exit(EXIT_FAILURE);
   }

   for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
	   token = strtok_r(str1, argv[2], &saveptr1);
	   if (token == NULL)
		   break;
	   printf("%d: %s\n", j, token);

	   for (str2 = token; ; str2 = NULL) {
		   subtoken = strtok_r(str2, argv[3], &saveptr2);
		   if (subtoken == NULL)
			   break;
		   printf("\t --> %s\n", subtoken);
	   }
   }

   exit(EXIT_SUCCESS);
}

result

$ ./a.out 'a/bbb///cc;xxx:yyy:' ':;' '/'
1: a/bbb///cc
		--> a
		--> bbb
		--> cc
2: xxx
		--> xxx
3: yyy
		--> yyy

ํ•ด์„

์œ„์˜ ์˜ˆ์ œ๋Š” ์ด์ค‘ for๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ nested token ๋ถ„๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋‹ค.

delim์€ ํŒŒ์ด์ฌ ์‹์˜ delimiter์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค. ๊ฐœ๋ณ„์ ์ธ char ๋ฐ”์ดํŠธ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ํ†ต๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ์‚ฌ์šฉ์˜ˆ์ œ์—์„œ ์ฒซ๋ฒˆ์งธ delim์„ :;์œผ๋กœ ์ฃผ์—ˆ๋Š”๋ฐ : ๋˜๋Š” ;์— ๋Œ€ํ•˜์—ฌ ๋ชจ๋‘ ๋ถ„๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋‹ค.

strtok๋Š” ํ† ํฐํ™”ํ•  ๋ฌธ์ž์—ด์ด ๋” ์ด์ƒ ๋‚จ์•„์žˆ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” NULL์„ ๋ฆฌํ„ดํ•˜๊ณ  ๊ทธ ์™ธ์—๋Š” ๋น„์–ด์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด์˜ ์ฒซ๋ฒˆ์งธ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ๋ชจ๋“  delim๋“ค์€ Null-terminated character๋กœ ์ˆ˜์ •๋œ๋‹ค๋Š” ์  ์œ ์˜.

์ฒ˜์Œ ํ˜ธ์ถœ์—๋งŒ ์ธ์ž str์ด ํ•„์š”ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ๋ถ€ํ„ฐ๋Š” NULL๋กœ ๋ฐ”๊ฟ”์„œ ์ง‘์–ด๋„ฃ๋Š” ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.